//
//  MLSOAuthController.swift
//  MLSMircoBlog
//
//  Created by 袁航 on 15/7/30.
//  Copyright © 2015年 yuanhang. All rights reserved.
//

import UIKit
import SVProgressHUD
// 遵守webView协议,监听webView的加载
class MLSOAuthController: UIViewController,UIWebViewDelegate {
    //MARK:- 是否是注册按钮点击
    var isRegister: Bool = false
    //MARK:- 重定义一个init方法,判断是否是注册按钮点击
    init(register: Bool) {
        super.init(nibName: nil, bundle: nil)
        isRegister = register
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    //MARK:- 系统方法
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 加载网页(如果不是注册按钮,就加载授权(登录)界面)
        if !isRegister {
            webView.loadRequest(NSURLRequest(URL: MLSNetworkTool.sharNewworkTools.oauthURL()))
        } else {
            webView.loadRequest(NSURLRequest(URL: MLSNetworkTool.sharNewworkTools.regesterURL()))
        }
        
        // 设置navgationbar的按钮
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "关闭", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
    }
    
    //MARK: 替换view为webView
    override func loadView() {
        view = webView
    }
    
    
    // MARK:- 关闭按钮
    func close() {
        // 关闭指示器
        SVProgressHUD.dismiss()
        // 把modal出的控制器收回
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    //MARK:- webView代理方法
    // 开始加载
    func webViewDidStartLoad(webView: UIWebView) {
        // 显示指示器
        SVProgressHUD.show()
    }
    
    // 加载完成
    func webViewDidFinishLoad(webView: UIWebView) {
        // 关闭指示器
        SVProgressHUD.dismiss()
    }
    
    // 加载失败
    func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
        
        // 判断是否是用户点击授权按钮之后的返回错误
        if let result = error?.userInfo["NSErrorFailingURLKey"]?.query {
            if (result?.hasPrefix("code=") != nil) {
                return
            }
        }
        
        // 如果不是用户点击授权按钮,就提示网络不给力
        SVProgressHUD.showInfoWithStatus("网络不给力")
        print(error)
        // 提示用户后,稍等一下,在关闭控制器
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
            self.close()
        }
    }
    
    // 加载requeset
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        // 如果发送的请求不包含回调地址,直接加载
        if let requestStr = request.URL?.absoluteString where !requestStr.hasPrefix(MLSNetworkTool.sharNewworkTools.redirectUri) {
            return true
        }
        
        // 发送的请求包含回调地址(处理返回的授权码)
        if let query = request.URL?.query where query.hasPrefix("code=") {
            
            // 获取code授权码
            let code = query.substringFromIndex(advance(query.startIndex, "code=".characters.count))
            
            // 加载授权(跳转控制器)
            self.loadAccesoryCode(code)
        }else {
            // 入如果不包含code就关闭授权控制器
            
            // 提示授权失败
            SVProgressHUD.showInfoWithStatus("授权失败")
            
            // 延迟一秒关闭
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
                self.close()
            }
        }
        
        // 不加载网页(做授权登录处理)
        return false
    }
    
    //MARK:- 授权处理
    ///  授权处理
    ///  - parameter code
    private func loadAccesoryCode(code: String) {
        
        // 调用工具类,加载token
        MLSNetworkTool.sharNewworkTools.accessToken(code, finshed: { (dict, error) -> () in
            
            // 如果出错,或者返回数据位nil,提示网络不给力,并关闭
            if error != nil || dict == nil{
                self.netWorkError()
                return
            }
            
            // 如果没有出错,字典转模型(获取带有token的accessToken对象)
            let accountToken: MLSAccessToken = MLSAccessToken(dict: dict!)
            
            // 使用带有token(授权信息)的accessToken的对象获取用户信息
            accountToken.loadUserAccountInfo({ (error) -> () in
                if error != nil {
                    self.netWorkError()
                    return
                }
            })
            
            // 提示授权成功
            SVProgressHUD.showInfoWithStatus("授权成功")
            // 延迟1秒,发送通知切换控制器
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
                // MARK:发送通知--跳转控制器
                NSNotificationCenter.defaultCenter().postNotificationName(MLSChangeRootviewControllerNotifaction, object: self, userInfo: [MLSChangeRootVCNotiUserInfoKey : MLSWelcomeController()])
                // MARK:- 关闭webView控制器
                self.close()
                
            }
        })
        
    }
    
    //MARK:- 网络加载错误
    private func netWorkError() {
        // 提示
        SVProgressHUD.showInfoWithStatus("您的网络不给力")
        // 延迟一会儿关闭界面
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
            self.close()
        }
    }
    
    //MARK:- 懒加载
    lazy var webView: UIWebView = {
        let oauthView = UIWebView()
        // 成为代理
        oauthView.delegate = self
        return oauthView
        }()
    
}
